#include <iostream>

using namespace std;

/*
 * 加号运算符重载
 *  实现两个自定义数据类型相加的运算, 对于内置数据类型的表达式的运算符重载不可能实现
 *      1、成员函数重载
 *      2、全局函数重载
 *      注：运算符重载也可以发生函数重载
 */

class Person{
public:
    // 成员函数重载
//    Person operator+ (Person &p){
//        Person temp;
//        temp.p_a = this->p_a + p.p_a;
//        temp.p_b = this->p_b + p.p_b;
//        return temp;
//    }
    Person(){

    }

    Person(int a, int b){
        p_a = a;
        p_b = b;
    }
    int p_a;
    int p_b;
};

Person operator+(Person &p1, Person &p2){
    Person temp;
    temp.p_a = p1.p_a + p2.p_a;
    temp.p_b = p1.p_b + p2.p_b;
    return temp;
}

Person operator+(Person &p, int num){
    Person temp;
    temp.p_a = p.p_a + num;
    temp.p_b = p.p_b + num;
    return temp;
}

void test01(){
    Person p1(10, 10);
    Person p2(20, 20);
    // 成员函数重载本质调用
//    Person p3 = p1.operator+(p2);

    // 全局函数重载本质调用
    Person p3 = operator+(p1, p2);

    // 简化版本
//    Person p3 = p1 + p2;
    cout << "p3.p_a= " << p3.p_a << endl;
    cout << "p3.p_b= " << p3.p_b << endl;

    // 函数重载
    Person p4 = operator+(p1, 100);
    cout << "p4.p_a= " << p4.p_a << endl;
    cout << "p4.p_b= " << p4.p_b << endl;

}

int main() {
    test01();

    return 0;
}
